iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

30天Swift純Code之旅 - 鬧鐘篇系列 第 17

Swift純Code之旅 Day17. 「複習 - 新增頁面、TableView、TableViewCell」

  • 分享至 

  • xImage
  •  

前言

目前標籤頁面的畫面及功能已經完成,接下來繼續新增「重複」頁面,算是再熟悉一下TableView的使用。
https://ithelp.ithome.com.tw/upload/images/20210927/20108999T8nNLeElUE.png

實作

一樣新增一個ViewController,並命名為「RepeatAlarmViewController」。
之後我們看一下IPhone內建鬧鐘的「重複」頁面長什麼樣子。
https://ithelp.ithome.com.tw/upload/images/20210927/20108999IXMEHImzBq.jpg

有七個外觀長的一模一樣的長方體,當遇到很多長一樣的長方體時,就可以使用TableView來實作它。

RepeatAlarmTableViewCell

  1. 建立TableViewCell,並命名為「RepeatAlarmTableViewCell」,
    可以看到每個Cell只有最左邊的一行字而已,因此只需要一個UILabel即可完成。
class RepeatAlarmTableViewCell: UITableViewCell {

    // 設定 RepeatAlarmTableViewCell的識別碼
    static let identifier = "repeatAlarmTableViewcCell"
    
    // MARK: - IBOutLets
    let titleLabel: UILabel = {
        let label = UILabel()
        label.textColor = .white
        return label
    }()
    
    // MARK: - Init
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.backgroundColor = #colorLiteral(red: 0.1333159506, green: 0.1333458424, blue: 0.1419014633, alpha: 1)
        setViews()
        setLayouts()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    // MARK: - setViews
    func setViews() {
        // 將titleLabel加進這個TableViewCell內
        self.addSubview(titleLabel)
    }
    
    // MARK: - setLayouts
    func setLayouts() {
        titleLabel.snp.makeConstraints { make in
            // titleLabel的頂部,底部,左邊都貼齊TableViewCell
            make.top.bottom.equalTo(self)
            // titleLabel的左邊貼齊TableViewCell的左邊間隔10
            make.leading.equalTo(self).offset(10)
        }
    }
}


RepeatAlarmViewController

  1. 先在剛剛新增的「RepeatAlarmViewController」內,建立一個TableView
    並註冊剛剛建立的「RepeatAlarmTableViewCell」
  2. 建立左邊文字的陣列
  3. 實作TableView Delegate & DataSource
  4. 設定TableView的Layout

那整個「RepeatAlarmViewController」會像以下:

class RepeatAlarmViewController: UIViewController {

    // MARK: - Properties
    let titleDatas: [String] = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六",]
    
    // MARK: - IBLayOuts
    let repeatTableView: UITableView = {
        let tableView = UITableView()
        // 註冊Cell
        tableView.register(RepeatAlarmTableViewCell.self, forCellReuseIdentifier: RepeatAlarmTableViewCell.identifier)
        tableView.bounces = false
        return tableView
    }()
    
    // MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        initView()
        setViews()
        setLayouts()
    }
    
    // MARK: - Function
    func initView() {
        
        // 設定navigationBar上面的文字
        self.title = "重複"
        
        // 設定navigation BackButton Color
        self.navigationController?.navigationBar.tintColor = .orange
        
        // 設定該ViewController的背景色
        self.view.backgroundColor = #colorLiteral(red: 0.1097886786, green: 0.1098149046, blue: 0.1183715835, alpha: 1)
        
        self.repeatTableView.delegate = self
        self.repeatTableView.dataSource = self
    }
    
    func setViews() {
        self.view.addSubview(repeatTableView)
    }
    
    func setLayouts() {
        repeatTableView.snp.makeConstraints { make in
            make.top.equalTo(self.view.safeAreaLayoutGuide).offset(50)
            make.centerX.equalTo(self.view)
            make.width.equalTo(self.view)
            make.height.equalTo(350)
        }
    }
}

extension RepeatAlarmViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return titleDatas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: RepeatAlarmTableViewCell.identifier, for: indexPath) as? RepeatAlarmTableViewCell else {  return UITableViewCell() }
        
        cell.titleLabel.text = titleDatas[indexPath.row]
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
}


最後呢,到「AddAlarmViewController」內,變更一下TableView - didSelectRowAt()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        switch indexPath.row {
        // 點擊第一欄時,要做什麼
        case 0:
            let vc = RepeatAlarmViewController()
            self.navigationController?.pushViewController(vc, animated: true)
        // 點擊第二欄時,要做什麼
        case 1:
            let vc = AlarmLabelViewController()
            
            // 讓AddAlarmViewController成為
            // AlarmLabelViewController的updateAlarmLabelDelegate的執行者
            vc.updateAlarmLabelDelegate = self
            
            // 使用navigationController的pushViewController(),達到畫面由右至左的效果。
            self.navigationController?.pushViewController(vc, animated: true)
        // 點擊第三欄時,要做什麼
        case 2:
            break
        // 點擊第四欄時,要做什麼
        case 3:
            break
        default:
            break
        }
    }

那現在程式應該會長這樣子


上一篇
Swift純Code之旅 Day16. 「頁面傳值?代理? Delegate?Protocol?(2)」
下一篇
Swift純Code之旅 Day18. 「選取TableViewCell」
系列文
30天Swift純Code之旅 - 鬧鐘篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言